package spring.study.annotation.cofig;

import org.springframework.context.annotation.*;
import spring.study.annotation.Condition.Linux;
import spring.study.annotation.Condition.MyImports;
import spring.study.annotation.Condition.Windows;
import spring.study.annotation.bean.Color;
import spring.study.annotation.bean.Person;
import spring.study.annotation.bean.Red;

/**
 * @author study
 * @version 1.0
 * @date 2020/6/18 23:05
 */
//满足当前条件，这个类中配置的所有bean注册才能生效
@Conditional(Windows.class)
@Configuration
@Import({Color.class, Red.class, MyImports.class})//组件，ID默认是组件的全类名
public class MainConfig2 {
    //默认是单实例的|

    /**
     * * @see ConfigurableBeanFactory#SCOPE_PROTOTYPE|prototype
     * * @see ConfigurableBeanFactory#SCOPE_SINGLETON|singleton
     * * @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
     * * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
     * prototype:多实例的|IOC启动不会调用方法创建对象放入容器，而是每次获取是才会调用方法创建对象
     * singleton:单实例 默认|IOC启动放入容器
     * REQUEST:同一次请求创建一个实例。
     * <p>
     * -------------------------------
     * 懒加载
     * 单实例bean：默认在容器启动时创建对象。
     * 懒加载：容器启动不创建对象，第一次使用 Bean获取对象。
     */
    @Bean
    // @Scope("prototype")
    @Lazy
    public Person person() {
        System.out.println("给容器中添加方法");
        return new Person("lisi", 20);
    }

    /*******************************************
     *Conditional :按照一定的条件进行判断，满足容器给容器中注册bean
     *Condition
     ******************************************/
    @Conditional(Windows.class)
    @Bean("bili")
    public Person person01() {
        return new Person("Bili Gates", 63);
    }

    @Bean("linus")
    @Conditional(Linux.class)
    public Person person02() {
        return new Person("linus", 50);
    }

    /**
     * 给容器中注册组件
     * 1）包扫描+组件标注|@Controller @Service
     * 2) @Bean[导入第三方包里面的组件]
     * 3） @Import[快速给容器总导入一个组件]
     * 4) Spring提供的 FactoryBean (工厂Bean)
     */
    /*******************************************
     *
     *
     ******************************************/
}
